/* 
    buffer 是一整個家族，總共有五個相關的 operators
    buffer bufferCount bufferTime bufferToggle bufferWhen
    這裡比較常用到的是 buffer, bufferCount 跟 bufferTime 這三個
*/

var source = Rx.Observable.interval(300).take(7);
// var source2 = Rx.Observable.interval(1000);
// var example = source.buffer(source2);

// var example = source.bufferTime(1000); // 上面的案例我们可以通过事件缓存

var example = source.bufferCount(3); // 除了用时间我们也可以使用数量来缓存


example.subscribe({
    next: (value) => { console.log(value); },
    error: (err) => { console.log('Error: ' + err); },
    complete: () => { console.log('complete'); }
});
// [0,1,2]
// [3,4,5]
// [6,7,8]...
/* 
    bufferWhen 
        将过往的值收集到数组中， 当开始收集数据的时候, 调用函数返回 Observable,
        当该Observable发出数据后(next())关闭缓冲区，当关闭缓冲区的时候, 会立马开启新的缓冲区，并不断重复此过程。
*/
const button = document.getElementById('bufferDemo');
const click = Rx.Observable.fromEvent(button, 'click')
const example1 = click //点击时开始收集事件
                    .bufferWhen(() => click.delay(500)) //将此阶段收集到的数据延迟500毫秒以后返回新的Observable

example1.subscribe({
    next: (value) => {
        // 500毫秒后调用此方法，来判断此时间段的点击行为
        console.log(value, 'value');
        if (value.length >= 2) {
            alert('双击了')
        }
    },
    error: (err) => { console.log('Error: ' + err); },
    complete: () => { console.log('complete'); }
});